/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package sisgraf.model;
import java.io.Serializable;
import java.util.Collection;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToMany;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.JoinTable;
import sisgraf.controler.AcessoControler;
import sisgraf.controler.ModuloControler;
import sisgraf.dao.AcessoDaoImp;
import sisgraf.dao.FuncaoDaoImp;
import sisgraf.dao.ModuloDaoImp;
/**
 *
 * @author Jordan de Carvalho Guerra
 */
@Entity
public class Perfil implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue
    private Integer id;
    private String descricao;
    @ManyToMany(targetEntity = Acesso.class, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
    @JoinTable(name = "permissao", joinColumns = {
        @JoinColumn(name = "idPerfil")}, inverseJoinColumns = {
        @JoinColumn(name = "idAcesso")})
    private Set<Acesso> acesso = new HashSet<Acesso>(0);
     public Collection getAcesso() {
         return acesso;
     }
    /*
    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable( name = "usuarioPerfil",
                catalog = "sisgraf",
                joinColumns = { @JoinColumn(    name = "idPerfil",
                                                nullable = false,
                                                updatable = false
                                )
                },
                inverseJoinColumns = {  @JoinColumn(    name = "idUsuario",
                                                        nullable = false,
                                                        updatable = false
                                        )
                }
    )
     *
     */
//    private Set<Usuario> usuario = new HashSet<Usuario>(0);
    public Perfil() {
    }
    public Perfil(Integer id) {
        this.id = id;
    }
    public Perfil(Integer id, String descricao) {
        this.id = id;
        this.descricao = descricao;
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getDescricao() {
        return descricao;
    }
    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }
    /*
    public Set<Acesso> getAcesso() {
        return acesso;
    }
     */

    public void setAcesso(Set<Acesso> acesso) {
        this.acesso = acesso;
    }
    public boolean getPermissao(String modulo, String funcao) {
        Acesso pesq;
        Iterator it = acesso.iterator();
	while (it.hasNext())
	{
	   pesq= (Acesso) it.next();
           if (pesq.getModulo().getSigla().equals(modulo)&&pesq.getFuncao().getSigla().equals(funcao)){
               return true;
           }
	}
        return false;
    }
    public void setPermissao(String modulo, String funcao, boolean estado) {
        Acesso pesq;
        boolean existe=false;
        Iterator it = acesso.iterator();
	while (it.hasNext())
	{
	   pesq= (Acesso) it.next();
           if (pesq.getModulo().getSigla().equals(modulo)&&pesq.getFuncao().getSigla().equals(funcao)){
               existe = true;
               if (!estado){
                   it.remove();
               }
           }
	}
        if (estado&&!existe){
            List<Modulo> listMod =  new ModuloDaoImp().list("m.sigla = '"+modulo+"'");
            Modulo mod = new Modulo();
            if (!listMod.isEmpty()){
                mod = (Modulo) listMod.get(0);
            }
            List<Funcao> listFun =  new FuncaoDaoImp().list("f.sigla = '"+funcao+"'");
            Funcao fun = new Funcao();
            if (!listFun.isEmpty()){
                fun = (Funcao) listFun.get(0);
            }
//            List<Acesso> listAce =  new AcessoDaoImp().list("a.idModulo = "+mod.getId());
            List<Acesso> listAce =  new AcessoDaoImp().list("modulo.sigla = '"+modulo+"' and funcao.sigla = '"+funcao+"'");
            pesq = new Acesso();
            if (!listAce.isEmpty()){
                pesq = (Acesso) listAce.get(0);
            } else {
                pesq.setModulo(mod);
                pesq.setFuncao(fun);
                AcessoControler acessoControler =new AcessoControler();
                acessoControler.adicionarAcesso(pesq);
            }
            acesso.add(pesq);
        }
    }
    /*
    public Set<Usuario> getUsuario() {
        return usuario;
    }
    public void setUsuario(Set<Usuario> usuario) {
        this.usuario = usuario;
    }
     *
     */
}




/*
 *
 * -----------------------------------------------------------------
import java.awt.Color;
import java.util.*;

public class CollectionTest
{
	private String colors[] = {"red", "white", "blue"};

	public CollectionTest()
	{
		ArrayList list = new ArrayList();

		list.add(Color.magenta);

		for (int i = 0; i < colors.length; i++)
			list.add(colors[i]);

		list.add(Color.cyan);

		System.out.println("\nArrayList: ");

		for (int i = 0; i < list.size(); i++)
			System.out.print(list.get(i) + " ");

		removeStrings(list);

		System.out.println("\n\nArrayList após remover as Strings: ");

		for (int i = 0; i < list.size(); i++)
			System.out.print(list.get(i) + " ");

	}

	public void removeStrings(Collection col)
	{
		Iterator it = col.iterator();

		while (it.hasNext())
		{
			if (it.next() instanceof String)
				it.remove();
		}
	}

	public static void main(String args[])
	{
		new CollectionTest();
	}
}

 *
 *
 *
 */
